package torrent

import (
	"encoding/hex"
	"path/filepath"
)

type Hash [32]byte // 哈希值类型，用于存储blake3哈希
type Path []string // 文件路径类型，用于存储文件的多级目录路径

// TorrentMeta 种子文件的元数据结构体，包含种子的所有核心信息
type TorrentMeta struct {
	RootPath    string     // 种子根目录（目录名）
	InfoHash    Hash       // 种子的infohash，用于唯一标识种子
	Files       []FileInfo // 文件信息数组，包含种子中所有文件的详细信息
	PieceLength int        // 每个块的大小（字节数），用于分块存储和校验
	TotalLength int64      // 总大小（字节数），种子包含的所有文件的总大小
}

// FileInfo 单个文件的信息结构体，描述种子中每个文件的详细信息
type FileInfo struct {
	Path        Path   // 文件路径（多级目录），以字符串数组形式存储相对路径
	Length      int64  // 文件大小（字节数）
	PieceHashes []Hash // 文件的哈希数组（分块后每个块的哈希），用于完整性校验
}

// VerifyResult 校验结果结构体，包含种子校验后的详细结果信息
type VerifyResult struct {
	MissingFiles []string // 需要重新下载的文件列表（不存在或hash不匹配）
	ExtraFiles   []string // 需要删除的多余文件列表（目录中存在但种子中不存在）
}

// GetInfoHashString 获取种子的infohash字符串形式
func (h Hash) String() string {
	return hex.EncodeToString(h[:])
}

// String 实现Path类型的String方法，用于将路径数组转换为字符串表示
func (p Path) String() string {
	return filepath.Join(p...)
}
